package com.wll.design.责任链.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 这个接口或者抽象类，需要：
 *
 * 有一个指向责任下一个对象的属性
 * 一个设置下一个对象的set方法
 * 给子类对象差异化实现的方法（如以下代码的doFilter方法）
 */
public abstract class AbstractHandler {

    /**
     * 责任链中的下一个对象
     */
    private AbstractHandler nextHandler;

    /**
     * 设置下一个 责任链中的下一个对象
     */
    public void setNextHandler(AbstractHandler abstractHandler) {
        this.nextHandler = abstractHandler;
    }

    /**
     * 获取下一个责任链
     *
     * @return
     */
    public AbstractHandler getNextHandler() {
        return nextHandler;
    }

    /**
     * 具体参数拦截逻辑，留给子类实现
     *
     * @param request
     * @param response
     */
    public void filter(HttpServletRequest request, HttpServletResponse response) {
        doFilter(request, response);
        if (getNextHandler() != null) {
            getNextHandler().filter(request, response);
        }
    }

    abstract void doFilter(HttpServletRequest request, HttpServletResponse response);

}
